package org.robotninjas.riemann.load; import com.google.common.collect.Queues; import com.google.inject.Inject; import com.google.inject.Key; import com.google.inject.Provider; import com.yammer.metrics.core.Gauge; import com.yammer.metrics.core.MetricName; import com.yammer.metrics.core.MetricsRegistry; import org.apache.commons.pool.impl.GenericObjectPool; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.MessageEvent; import org.robobninjas.riemann.guice.RiemannClientModule; import org.robotninjas.riemann.client.ReturnableMessage; import java.util.Queue; import java.util.concurrent.BlockingQueue; public class InstrumentedClientModule extends RiemannClientModule { public InstrumentedClientModule(String address, int port, int numWorkers, GenericObjectPool.Config poolConfig) { super(address, port, numWorkers, poolConfig); } @Override protected void bindOutstandingMessagesQueue(Key<BlockingQueue<ReturnableMessage>> key) { bind(key).toProvider(new Provider<BlockingQueue<ReturnableMessage>>() { @Inject MetricsRegistry registry = null; @Override public BlockingQueue<ReturnableMessage> get() { final BlockingQueue<ReturnableMessage> queue = Queues.newLinkedBlockingQueue(); registry.newGauge(new MetricName(getClass(), "unacked"), new Gauge<Integer>() { @Override public Integer value() { return queue.size(); } }); return queue; } }); } @Override protected void bindSendBufferQueue(Key<Queue<MessageEvent>> key) { bind(key).toProvider(new Provider<Queue<MessageEvent>>() { @Inject MetricsRegistry registry = null; @Override public Queue<MessageEvent> get() { final Queue<MessageEvent> queue = Queues.newConcurrentLinkedQueue(); registry.newGauge(new MetricName(getClass(), "buffered-sends"), new Gauge<Integer>() { @Override public Integer value() { return queue.size(); } }); return queue; } }); } @Override protected void configureBootstrap(ClientBootstrap bootstrap) { bootstrap.setOption("writeBufferHighWaterMark", 65536 * 2); bootstrap.setOption("writeBufferLowWaterMark", 65536 ); bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("child.tcpNoDelay", true); } }